package com.zzyl.job;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.json.JSONUtil;
import com.zzyl.constant.CacheConstants;
import com.zzyl.entity.AlertRule;
import com.zzyl.mapper.AlertRuleMapper;
import com.zzyl.service.AlertRuleService;
import com.zzyl.vo.DeviceDataVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

@Component
public class AlertJob {
/**
 * @author     ：zhangheng
 * @date       ：Created in 2024/9/13 15:47
 * @description：定时任务过滤数据设备上报数据报警规则过滤
 * @modified By：
 * @version: 1.0
 */
    /**
     * @Scheduled(cron = "0 * * * * ?") 这个注解的意思是在 Spring 框架中，使用定时任务（Scheduled Task）来执行某个方法。具体来说，这个注解表示该方法将在每小时的第零分钟执行一次。
     *
     * Cron 表达式是一种用于配置定时任务执行时间的字符串格式。在这个例子中，Cron 表达式的各个字段的含义如下：
     *
     * 0: 秒（Seconds）字段，表示在第零秒执行。
     * *: 分（Minutes）字段，表示每分钟都执行。
     * *: 小时（Hours）字段，表示每小时都执行。
     * *: 日期（Day of month）字段，表示每天都执行。
     * *: 月份（Month）字段，表示每个月都执行。
     * ?: 星期（Day of week）字段，表示不关心星期几，即每周的任何一天都可以执行。
     * 因此，@Scheduled(cron = "0 * * * * ?") 表示这个方法将在每小时的第零分钟执行一次，无论哪一天、哪个月或星期几。
     */
    @Autowired
    private AlertRuleMapper alertRuleMapper;
    @Autowired
    private StringRedisTemplate redisTemplate;
    @Autowired
    private AlertRuleService alertRuleService;
    @Scheduled(cron = "0 * * * * ? ")
public void deviceDataAlertFilter(){

        List<AlertRule> alertRules = alertRuleMapper.selectByFunctionId(null, null, null);
        //1、查询所有报警规则，如果为空，程序结束
        if (CollUtil.isEmpty(alertRules)){
            return;
        }
        //2、查询所有设备最新上报数据，如果为空，程序结束
        List<Object> jsonStrList = redisTemplate.opsForHash().values(CacheConstants.DEVICE_LASTDATA_CACHE_KEY);
        if (CollUtil.isEmpty(jsonStrList)){
            return;
        }
        //3、设备上报数据不为空，提取设备上报数据为List
             List<DeviceDataVo> deviceDataVoList=new ArrayList<>();
        jsonStrList.forEach(d->{
                  //deviceDataVoList.addAll(JSONUtil.toList(d.toString())),DeviceDataVo.class);
            deviceDataVoList.addAll(JSONUtil.toList(d.toString(), DeviceDataVo.class));
        });
        //4、对每一条设备上报数数据进行报警规则校验
        deviceDataVoList.forEach(deviceDataVo -> {
            alertRuleService.alertFilter(deviceDataVo);
        });
}
}

